package com.yhq.basic.jvm.dataarea;

/**
 * 从字节码分析Java的运算法
 * 参考：https://zhuanlan.zhihu.com/p/646805219
 * @author hqyin
 * @date 2024/10/17 5:15 PM
 */
public class Demo9JavaOperator {
    public static void main(String[] args) {
        //算术运算符 +，-，*，/，%
        //注意：这些运算符计算的结果都会保存在操作数栈中；
        test_arithmeticOperator();
        //TODO:自增自减，--，++指令都是iinc，是把局部变量表中的变量自增1或自减1；
        //TODO:++i,先把局部变量表中的i变量自增，再结果load到操作数栈，因此表达式的结果是自增之后的结果；
        //TODO:i++,先把i的值load到操作数栈，再把局部变量表中的i变量自增，因此表达式的结果是自增之前的结果；
        test_autoIncr();
        test_autoDecr();
        //赋值运算符

        //比较运算法/关系运算符
        //逻辑运算符
        //条件运算符
        //位运算符

    }

    private static void test_autoDecr() {
        int i=10;
        // 先load到操作数栈，再把局部变量表的10减1，局部变量表的值变成了9，因此打印操作数栈的结果是10；
        System.out.println(i--);
        // 先把局部变量表的9减1，再把结果load到操作数栈，在打印操作数栈的结果
        System.out.println(--i);
    }

    private static void test_autoIncr() {
        int i = 1;
        System.out.println(i++);
        System.out.println(++i);
    }

    private static void test_arithmeticOperator() {
        int i=2;
        System.out.println(((i+3)-1)*4/2%2);
    }
}
